home *** CD-ROM | disk | FTP | other *** search
/ Micromanía: 150 Juegos 2010 / 150Juegos_16.iso / Shareware / Shape Smash / shape-smash.swf / scripts / mx / binding / Binding.as next >
Encoding:
Text File  |  2010-05-14  |  5.3 KB  |  167 lines

  1. package mx.binding
  2. {
  3.    import mx.collections.errors.ItemPendingError;
  4.    import mx.core.mx_internal;
  5.    
  6.    use namespace mx_internal;
  7.    
  8.    public class Binding
  9.    {
  10.       mx_internal static const VERSION:String = "2.0.1.0";
  11.       
  12.       mx_internal var destFunc:Function;
  13.       
  14.       mx_internal var srcFunc:Function;
  15.       
  16.       mx_internal var destString:String;
  17.       
  18.       mx_internal var document:Object;
  19.       
  20.       private var hasHadValue:Boolean;
  21.       
  22.       mx_internal var isExecuting:Boolean;
  23.       
  24.       mx_internal var isHandlingEvent:Boolean;
  25.       
  26.       public var twoWayCounterpart:Binding;
  27.       
  28.       private var wrappedFunctionSuccessful:Boolean;
  29.       
  30.       public var uiComponentWatcher:int;
  31.       
  32.       private var lastValue:Object;
  33.       
  34.       public function Binding(param1:Object, param2:Function, param3:Function, param4:String)
  35.       {
  36.          super();
  37.          this.mx_internal::document = param1;
  38.          this.mx_internal::srcFunc = param2;
  39.          this.mx_internal::destFunc = param3;
  40.          this.mx_internal::destString = param4;
  41.          mx_internal::isExecuting = false;
  42.          mx_internal::isHandlingEvent = false;
  43.          hasHadValue = false;
  44.          uiComponentWatcher = -1;
  45.          BindingManager.addBinding(param1,param4,this);
  46.       }
  47.       
  48.       public function watcherFired(param1:Boolean, param2:int) : void
  49.       {
  50.          var commitEvent:Boolean = param1;
  51.          var cloneIndex:int = param2;
  52.          if(mx_internal::isHandlingEvent)
  53.          {
  54.             return;
  55.          }
  56.          try
  57.          {
  58.             mx_internal::isHandlingEvent = true;
  59.             execute(cloneIndex);
  60.          }
  61.          finally
  62.          {
  63.             mx_internal::isHandlingEvent = false;
  64.          }
  65.       }
  66.       
  67.       protected function wrapFunctionCall(param1:Object, param2:Function, param3:Object = null, ... rest) : Object
  68.       {
  69.          var result:Object = null;
  70.          var thisArg:Object = param1;
  71.          var wrappedFunction:Function = param2;
  72.          var object:Object = param3;
  73.          var args:Array = rest;
  74.          wrappedFunctionSuccessful = false;
  75.          try
  76.          {
  77.             result = wrappedFunction.apply(thisArg,args);
  78.             wrappedFunctionSuccessful = true;
  79.             return result;
  80.          }
  81.          catch(itemPendingError:ItemPendingError)
  82.          {
  83.             itemPendingError.addResponder(new EvalBindingResponder(this,object));
  84.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  85.             {
  86.                trace("Binding: destString = " + mx_internal::destString + ", error = " + itemPendingError);
  87.             }
  88.          }
  89.          catch(rangeError:RangeError)
  90.          {
  91.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  92.             {
  93.                trace("Binding: destString = " + mx_internal::destString + ", error = " + rangeError);
  94.             }
  95.          }
  96.          catch(error:Error)
  97.          {
  98.             if(error.errorID != 1006 && error.errorID != 1009 && error.errorID != 1010 && error.errorID != 1055 && error.errorID != 1069)
  99.             {
  100.                throw error;
  101.             }
  102.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  103.             {
  104.                trace("Binding: destString = " + mx_internal::destString + ", error = " + error);
  105.             }
  106.          }
  107.          return null;
  108.       }
  109.       
  110.       public function execute(param1:Object = null) : void
  111.       {
  112.          var o:Object = param1;
  113.          if(mx_internal::isExecuting || twoWayCounterpart && twoWayCounterpart.mx_internal::isExecuting)
  114.          {
  115.             hasHadValue = true;
  116.             return;
  117.          }
  118.          try
  119.          {
  120.             mx_internal::isExecuting = true;
  121.             wrapFunctionCall(this,innerExecute,o);
  122.          }
  123.          finally
  124.          {
  125.             mx_internal::isExecuting = false;
  126.          }
  127.       }
  128.       
  129.       private function nodeSeqEqual(param1:XMLList, param2:XMLList) : Boolean
  130.       {
  131.          var _loc3_:uint = 0;
  132.          var _loc4_:uint = 0;
  133.          _loc3_ = uint(param1.length());
  134.          if(_loc3_ == param2.length())
  135.          {
  136.             _loc4_ = 0;
  137.             while(_loc4_ < _loc3_ && param1[_loc4_] === param2[_loc4_])
  138.             {
  139.                _loc4_++;
  140.             }
  141.             return _loc4_ == _loc3_;
  142.          }
  143.          return false;
  144.       }
  145.       
  146.       private function innerExecute() : void
  147.       {
  148.          var _loc1_:Object = null;
  149.          _loc1_ = wrapFunctionCall(mx_internal::document,mx_internal::srcFunc);
  150.          if(BindingManager.debugDestinationStrings[mx_internal::destString])
  151.          {
  152.             trace("Binding: destString = " + mx_internal::destString + ", srcFunc result = " + _loc1_);
  153.          }
  154.          if(hasHadValue || wrappedFunctionSuccessful)
  155.          {
  156.             if(!(lastValue is XML && Boolean(lastValue.hasComplexContent()) && lastValue === _loc1_) && !(lastValue is XMLList && lastValue.hasComplexContent() && _loc1_ is XMLList && nodeSeqEqual(lastValue as XMLList,_loc1_ as XMLList)))
  157.             {
  158.                mx_internal::destFunc.call(mx_internal::document,_loc1_);
  159.                lastValue = _loc1_;
  160.                hasHadValue = true;
  161.             }
  162.          }
  163.       }
  164.    }
  165. }
  166.  
  167.